/**
 * @file midi2_translator.h
 * @brief MIDI 1.0 ↔ MIDI 2.0 格式转换器
 * @details 提供MIDI 1.0和MIDI 2.0消息之间的双向转换功能
 * @version 1.0
 * @date 2025-11-04
 */

#ifndef __MIDI2_TRANSLATOR_H__
#define __MIDI2_TRANSLATOR_H__

#include "midi_parser.h"
#include "midi2_ump.h"

/* ============================================================================
 * 分辨率转换宏定义
 * ============================================================================ */

/**
 * @brief 16位velocity转7位
 * @param v16 16位velocity (0-65535)
 * @return 7位velocity (0-127)
 * @note 转换公式: velocity_7 = velocity_16 >> 9
 */
#define MIDI2_VEL_16TO7(v16)    ((uint8_t)((v16) >> 9))

/**
 * @brief 7位velocity转16位
 * @param v7 7位velocity (0-127)
 * @return 16位velocity (0-65535)
 * @note 转换公式: velocity_16 = velocity_7 << 9
 */
#define MIDI2_VEL_7TO16(v7)     ((uint16_t)((v7) << 9))

/**
 * @brief 32位控制器值转7位
 * @param c32 32位控制器值 (0-4294967295)
 * @return 7位控制器值 (0-127)
 * @note 转换公式: cc_7 = cc_32 >> 25
 */
#define MIDI2_CC_32TO7(c32)     ((uint8_t)((c32) >> 25))

/**
 * @brief 7位控制器值转32位
 * @param c7 7位控制器值 (0-127)
 * @return 32位控制器值 (0-4294967295)
 * @note 转换公式: cc_32 = cc_7 << 25
 */
#define MIDI2_CC_7TO32(c7)      ((uint32_t)((c7) << 25))

/* ============================================================================
 * 函数声明
 * ============================================================================ */

/**
 * @brief 将MIDI 2.0消息转换为MIDI 1.0格式
 * @param msg2 输入: MIDI 2.0消息指针
 * @param msg1 输出: MIDI 1.0消息指针
 * @return 0成功, -1失败
 *
 * @details 自动处理以下转换:
 *          - 16位velocity → 7位velocity
 *          - 32位控制器值 → 7位控制器值
 *          - Attribute字段丢弃 (MIDI 1.0不支持)
 *          - Group信息丢弃 (MIDI 1.0不支持)
 *
 * @note 转换后的msg1可直接用于现有MIDI 1.0处理流程
 */
int midi2_to_midi1(midi2_message_t *msg2, midi_message_t *msg1);

/**
 * @brief 将MIDI 1.0消息转换为MIDI 2.0格式
 * @param msg1 输入: MIDI 1.0消息指针
 * @param msg2 输出: MIDI 2.0消息指针
 * @return 0成功, -1失败
 *
 * @details 自动处理以下转换:
 *          - 7位velocity → 16位velocity
 *          - 7位控制器值 → 32位控制器值
 *          - Group默认设为0
 *          - Attribute设为ATTR_NONE
 *
 * @note 此函数用于未来可能的MIDI 2.0输出功能
 */
int midi1_to_midi2(midi_message_t *msg1, midi2_message_t *msg2);

/**
 * @brief 16位velocity转7位 (函数版本)
 * @param velocity_16 16位velocity (0-65535)
 * @return 7位velocity (0-127)
 */
static inline uint8_t midi2_velocity_16to7(uint16_t velocity_16)
{
    return MIDI2_VEL_16TO7(velocity_16);
}

/**
 * @brief 7位velocity转16位 (函数版本)
 * @param velocity_7 7位velocity (0-127)
 * @return 16位velocity (0-65535)
 */
static inline uint16_t midi2_velocity_7to16(uint8_t velocity_7)
{
    return MIDI2_VEL_7TO16(velocity_7);
}

/**
 * @brief 32位控制器值转7位 (函数版本)
 * @param controller_32 32位控制器值
 * @return 7位控制器值 (0-127)
 */
static inline uint8_t midi2_controller_32to7(uint32_t controller_32)
{
    return MIDI2_CC_32TO7(controller_32);
}

/**
 * @brief 7位控制器值转32位 (函数版本)
 * @param controller_7 7位控制器值 (0-127)
 * @return 32位控制器值
 */
static inline uint32_t midi2_controller_7to32(uint8_t controller_7)
{
    return MIDI2_CC_7TO32(controller_7);
}

#endif /* __MIDI2_TRANSLATOR_H__ */
